package host

import (
	"crypto/sha1"
	"encoding/json"
	"fmt"
)

const (
	PrivateIDC Vendor = iota
	Tencent
	AliYun
	HuaWei
)

type Vendor int

type Host struct {
	*Base
	*Resource
	*Describe
}

func (h *Host) GenHash() error {
	hash := sha1.New()
	b, err := json.Marshal(h.Resource)
	if err != nil {
		return err
	}
	hash.Write(b)
	h.ResourceHash = fmt.Sprintf("%x", hash.Sum(nil))

	b, err = json.Marshal(h.Describe)
	if err != nil {
		return err
	}
	hash.Reset()
	hash.Write(b)
	h.DescribeHash = fmt.Sprintf("%x", hash.Sum(nil))
	return nil
}

type Base struct {
	Id           string `json:"id"`            // 全局唯一id
	SyncAt       int64  `json:"sync_at"`       // 同步时间
	Vendor       Vendor `json:"vendor"`        // 厂商
	Region       string `json:"region"`        // 地域
	Zone         string `json:"zone"`          // 区域
	CreateAt     int64  `json:"create_at"`     // 创建时间
	InstanceId   string `json:"instance_id"`   // 实例id
	ResourceHash string `json:"resource_hash"` // 基础数据hash
	DescribeHash string `json:"describe_hash"` // 描述数据hash
}

type Resource struct {
	ExpireAt    int64             `json:"expire_at"`    // 过期时间
	Category    string            `json:"category"`     // 种类
	Type        string            `json:"type"`         // 规格
	Name        string            `json:"name"`         // 名称
	Description string            `json:"description"`  // 描述
	Status      string            `json:"status"`       // 服务商中的状态
	Tags        map[string]string `json:"tags"`         // 标签
	UpdateAt    int64             `json:"update_at"`    // 更新时间
	SyncAccount string            `json:"sync_account"` // 同步的账号
	PublicIP    string            `json:"public_ip"`    // 公网ip
	PrivateIP   string            `json:"private_ip"`   // 内网ip
	PayType     string            `json:"pay_type"`     // 实例付费方式
}

type Describe struct {
	ResourceId              string `json:"resource_id"`                // 关联Resourc
	CPU                     int    `json:"cpu"`                        // 核数
	Memory                  int    `json:"memory"`                     // 内存
	GPUAmount               int    `json:"gpu_amount"`                 // GPU数量
	GPUSpec                 int    `json:"gpu_spec"`                   // GPU类型
	OSType                  string `json:"os_type"`                    // 操作系统类型
	OSName                  string `json:"os_name"`                    // 操作系统名称
	SerialNumber            string `json:"serial_number"`              // 序列号
	ImageID                 string `json:"image_id"`                   // 镜像id
	InternetMaxBandwidthOut int    `json:"internet_max_bandwidth_out"` // 公网出带宽
	InternetMaxBandwidthIn  int    `json:"internet_max_bandwidth_in"`  // 公网入带宽
	KeyPairName             string `json:"key_pair_name"`              // 密钥对名称
	SecurityGroups          string `json:"security_groups"`            // 安全组
}
